﻿//#define _CRT_SECURE_NO_WARNINGS
//
//double Divide(int a, int b)
//{
//	// 当b == 0时抛出异常 
//	if (b == 0)
//	{
//		throw "Divide by zero condition!";
//	}
//	else
//	{
//		return (double)a / (double)b;
//	}
//}
//
//void Func()
//{
//	// 这里可以看到如果发生除0错误抛出异常，另外下⾯的array和array2没有得到释放。 
//	// 所以这里捕获异常后并不处理异常，异常还是交给外⾯处理，这里捕获了再重新抛出去。 
//	// 但是如果array2new的时候抛异常呢，就还需要套⼀层捕获释放逻辑，这里更好解决⽅案 是智能指针
//	int* array1 = new int[10];
//	int* array2 = new int[10]; // 抛异常呢 
//
//	try
//	{
//		int len, time;
//		cin >> len >> time;
//		cout << Divide(len, time) << endl;
//	}
//	catch (...)
//	{
//		cout << "delete []" << array1 << endl;
//		cout << "delete []" << array2 << endl;
//		delete[] array1;
//		delete[] array2;
//
//		throw; // 异常重新抛出，捕获到什么抛出什么 
//	}
//	// ...
//
//	cout << "delete []" << array1 << endl;
//	delete[] array1;
//	cout << "delete []" << array2 << endl;
//	delete[] array2;
//}
//
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (const char* errmsg)
//	{
//		cout << errmsg << endl;
//	}
//	catch (const exception& e)
//	{
//		cout << e.what() << endl;
//	}
//	catch (...)
//	{
//		cout << "未知异常" << endl;
//	}
//
//	return 0;
//}

#include<iostream>
using namespace std;

template<class T>
class SmartPtr
{
public:
    //RAII
    SmartPtr(T* ptr = nullptr)
        : _ptr(ptr)
    {}

    ~SmartPtr()
    {
        delete _ptr;
        cout << "~SmartPtr " << _ptr << endl;
    }

    //支持指针的各种行为
    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

    T operator[](size_t pos)
    {
        return _ptr[pos];
    }

private:
    T* _ptr;
};

double Divide(int a, int b)
{
    // 当b == 0时抛出异常 
    if (b == 0)
    {
        throw "Divide by zero condition!";
    }
    else
    {
        return (double)a / (double)b;
    }
}

void Func()
{
    // 这这里使⽤RAII的智能指针类管理new出来的数组以后，程序简单多了 
    SmartPtr<int> sp1 = new int[10];
    SmartPtr<int> sp2 = new int[10];

    int len, time;
    cin >> len >> time;
    cout << Divide(len, time) << endl;
}

int main()
{
    try
    {
        Func();
    }
    catch (const char* errmsg)
    {
        cout << errmsg << endl;
    }
    catch (const exception& e)
    {
        cout << e.what() << endl;
    }
    catch (...)
    {
        cout << "未知异常" << endl;
    }
    return 0;
}

